#pragma once

#include "ICollideAble.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Sphere  </Summary>
/// 
/// <purpose>	Collidable class that defines a triangle from a set of verts	</purpose>
////////////////////////////////////////////////////////////////////////////////////////////////////

class Triangle : public ICollideAble
{
public:

	/// <Summary> The verts that this triangle references </Summary>
	Vector3* verts;

	/// <Summary> The normal that this triangle references </Summary>
	Vector3* normal;

	/// <Summary> The indices into the verts and normals for access </Summary>
	unsigned int indices[3];

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets a vertex </Summary>
	///
	/// <Param name="index">	Zero-based index of the vertex </Param>
	///
	/// <Return>	The vertex </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Vector3& GetVertex(int index) { return verts[indices[index]]; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets a normal </Summary>
	///
	/// <Param name="index">	Zero-based index of the normal </Param>
	///
	/// <Return>	The normal </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Vector3& GetNormal() { return *normal; }

public:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Default constructor. </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Triangle() : verts(0), normal(0) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Virtual Destructor </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ~Triangle() { }

public:

	/// <Summary> The collision type of this object </Summary>
	static const HashString COLLISIONTYPE;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the collision type </Summary>
	///
	/// <Return>	The collision type </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual const HashString& GetCollisionType() const { return COLLISIONTYPE; }

protected:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Prints this object to the console </Summary>
	///
	/// <Param name="out">	The console window </Param>
	///
	/// <Return>	The console window </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ConsoleWindow& Print(ConsoleWindow& out) const;
};